package com.sws.study.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

/**
 * Created by george on 6/20/15.
 */
public class ReflectUtils {
    /**
     * JVM加载一个类的过程
     * [1.]装载：查找和导入Class文件；
       [2.]链接：执行校验、准备和解析步骤，其中解析步骤是可以选择的：
         [2.1]校验：检查载入Class文件数据的正确性；
         [2.2]准备：给类的静态变量分配存储空间；
         [2.3]解析：将符号引用转成直接引用；
       [3.]初始化：对类的静态变量、静态代码块执行初始化工作。
     * @return
     * @throws Throwable
     */
    public static Car initByDefaultConst() throws Throwable{
        ClassLoader loader=Thread.currentThread().getContextClassLoader();
        Class clzz=loader.loadClass("com.sws.study.reflect.Car");

        Constructor cons=clzz.getDeclaredConstructor((Class[])null);
        Car car=(Car)cons.newInstance();

        Method[] methods=clzz.getMethods();
        for(int i=0;i<methods.length;i++){
            Method method=methods[i];
            System.out.println(method.getName());
        }
        Method setBrand=clzz.getMethod("setBrand",String.class);
        setBrand.invoke(car,"aaaa");

        return car;

    }

    /**
     * 1.ClassLoader 根装载器
     * 2.ExtClassLoader 扩展类装载器
     * 3.AppClassLoader 系统类装载器
     * 根装载器不是ClassLoader的子类，它使用C++编写，因此我们在Java中看不到它，
     * 根装载器负责装载JRE的核心类库，如JRE目标下的rt.jar、charsets.jar等。
     * ExtClassLoader和AppClassLoader都是ClassLoader的子类。
     * 其中ExtClassLoader负责装载JRE扩展目录ext中的JAR类包；
     * AppClassLoader负责装载Classpath路径下的类包。
     */
    public static void classLoaderTest(){
        ClassLoader loader=Thread.currentThread().getContextClassLoader();
        System.out.println("current loader "+loader);
        System.out.println("parent loader "+loader.getParent());
        System.out.println("grandparent loader "+loader.getParent().getParent());
    }
}
